/*Copyright(c)2022,成都东软学院操作系统
*Allrightsreserved.
*文件名称：pthreadmutex2.c
*文件标识：
*摘	要：线程同步模拟售票
*
*当前版本：1.1
*作	者：hawkafcc
*完成日期：2022,年4月10日*/

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

int ticket_num = 15; //总票数

//初始化静态分配的互斥锁
//对于静态初始化的互斥锁，不需要调用 pthread_mutex_init() 函数
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void * pthread_fuction_1();//线程1
void * pthread_fuction_2();//线程2
//时间延迟
void  delay_s(int s);

int main(int argc, char *argv[])
{
    int retn;       //线程创建函数返回值 若retn不为0-->创建异常
	pthread_t tid1; //线程1 ID
	pthread_t tid2;  //线程2  ID
	//创建线程1
	retn = pthread_create(&tid1,NULL,pthread_fuction_1,NULL);
	if (retn != 0)
		printf("pthread_create error");
	//创建线程2
	retn = pthread_create(&tid2,NULL,pthread_fuction_2,NULL);
	if (retn != 0)
		printf("pthread_create error");
	// 以下部分为主进程代码
	while(ticket_num>=0)
	{
		//上锁:  如果锁未打开,排队等待,直至打开,再上锁
		pthread_mutex_lock(&lock);
    	if(ticket_num ==0 | ticket_num <0)
    	{
        	printf("进程(pid= %d)  , 票卖完了\n",getpid());
        	pthread_mutex_unlock(&lock);
        	break;
    	}
		printf("进程(pid= %d) , 卖票(票号 = %d)\n",getpid(),ticket_num);
		ticket_num--;
		//解锁
		pthread_mutex_unlock(&lock);
    	delay_s(1);//模拟售票行为，1秒出票
		//sleep(1);//模拟售票行为，1秒出票
 	}
	//等待线程1结束
	retn = pthread_join(tid1,NULL);
	if (retn != 0)
		printf("pthread_join error");
 	//等待线程2结束
	retn = pthread_join(tid2,NULL);
	if (retn != 0)
		printf("pthread_join error");
 	//销毁互斥锁
	pthread_mutex_destroy(&lock);
	exit(0);
}

void * pthread_fuction_1()
{
    while(ticket_num>=0)
	{
		//上锁: 如果锁未打开,排队等待,直至打开,再上锁
		pthread_mutex_lock(&lock);
		if(ticket_num ==0 | ticket_num <0)
		{
			printf("线程1( %u) , 票卖完了\n",pthread_self());
			pthread_mutex_unlock(&lock);
			break;
		}
		printf("线程1( %u) , 卖票(票号 = %d) \n",pthread_self(),ticket_num);
		ticket_num--;
		//解锁
		pthread_mutex_unlock(&lock);
      delay_s(1);
		//sleep(1);//模拟售票行为，1秒出票
	}
	pthread_exit("a");
}

void * pthread_fuction_2()
{
    while(ticket_num>=0)
	{
        //上锁: 如果锁未打开,等待,直至打开,再上锁
		pthread_mutex_lock(&lock);
            if(ticket_num ==0 | ticket_num <0)
            {
                printf("线程2( %u) , 票卖完了\n",pthread_self());
                pthread_mutex_unlock(&lock);
                break;
            }
		printf("线程2( %u) , 卖票(票号 = %d) \n",pthread_self(),ticket_num);
		ticket_num--;
		//解锁
		pthread_mutex_unlock(&lock);
        delay_s(1);
		//sleep(1);//模拟售票行为，1秒出票
	}
       	pthread_exit("b");
}

void  delay_s(int s)
{
	time_t secStart,secEnd;
	int sec=0;
	secStart = time((time_t *)NULL);
	while(sec<=s)
    {
        secEnd= time((time_t *)NULL);
        sec=secEnd-secStart;
    }
}
